package com.yc154.dao;

import com.yc.damai.entity.Product;
import org.springframework.data.r2dbc.repository.Query;
import org.springframework.data.r2dbc.repository.R2dbcRepository;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;

import java.util.List;

public interface ProductDao extends R2dbcRepository<Product,Integer> {

    Flux<Product> findByPnameContaining(String pname);

    /*
        坑: Spring Data R2DBC 在某些版本中，对于自定义的 @Query 更新操作，
        即使声明返回 Mono<Integer>，也可能不会发出实际的值。
        解决方案
        方案1：使用 thenReturn 强制返回值
        方案2：使用 then + Mono.just
        方案3：修改 Repository 方法返回类型
        方案4：使用自定义的 R2DBC 模板（推荐）
     */
    @Query("update product a join promotion_detail b on a.pid=b.pid\n" +
            " set a.nums = a.nums - b.nums\n" +
            " where a.pid in (:pids)")
    Mono<Void> updateNumsByPidIn(List<Long> pids);

    @Query("update product a set a.nums = a.nums + :nums where a.pid = :pid")
    Mono<Void> updateNumsByPid(long pid, int nums);


    @Query("select a.pid,\n" +
            "a.pname,\n" +
            "a.market_price,\n" +
            "b.price shop_price,\n" +
            "a.image,\n" +
            "a.pdesc,\n" +
            "a.is_hot,\n" +
            "a.pdate,\n" +
            "a.csid,\n" +
            "b.nums\n" +
            " from product a" +
            " join promotion_detail b on a.pid = b.pid" +
            " where a.pid in (:pids)")
    Flux<Product> selectPromotionProducts(List<Long> pids);

}
